package com.yc.upload.web;

import com.yc.upload.web.vo.UploadProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

//将文件上传到指定的目录，目录 web 的访问路径必须是可以配置的
@RequestMapping("upload")
@RestController
public class UploadAction {

    @Autowired
    UploadProperties properties;

    //127.0.0.1/upload/one/image  上传图片
    //127.0.0.1/upload/one/video  上传视频
    @PostMapping("one/{path}")
    private String upload(@RequestParam MultipartFile file,
                          @PathVariable String path) throws IOException {
        String diskPath = properties.getMapping().get(path);
        String filename = file.getOriginalFilename();
        //获取后缀
        String suffix = filename.substring(filename.lastIndexOf("."));
        String newFileName = UUID.randomUUID() + suffix;
        File fileObj = new File(diskPath,newFileName);
        //file.transferTo(fileObj) 的作用是将一个文件的内容直接传输到另一个文件。
        //具体来说，file 是要传输内容的源文件，而 fileObj 则是目标文件，表示要将内容传输到的文件对象。
        // 通过调用 transferTo() 方法，源文件的内容会被直接传输到目标文件中，达到文件内容的快速传输或复制的效果。
        file.transferTo(fileObj);
        return path + "/" + newFileName;
    }

    @PostMapping("list/{path}")
    private List<String> upload(@RequestParam MultipartFile[] file,
                                @PathVariable String path) throws IOException {
        //TODO  扩展多文件上传功能
        List<String> list = new ArrayList<>();
        //获取磁盘路径
        String diskPath = properties.getMapping().get(path);
        for (MultipartFile multipartFile : file) {
            String filename = multipartFile.getOriginalFilename();
            String suffix = filename.substring(filename.lastIndexOf("."));
            String newFileName = UUID.randomUUID() + suffix;
            File fileObj = new File(diskPath,newFileName);
            multipartFile.transferTo(fileObj);
            list.add(path + "/" + newFileName);
        }
        return list;
    }

}
